#
#イベント情報の追加，更新，削除などを行う．
#主にajax経由で呼ばれる．
#
class EventController < ApplicationController
  # 共通レイアウト定義
  layout "mainpage", :except=>[:block_list, :dlg_index, :dlg_new, :dlg_edit, :dlg_create, :dlg_update, :dlg_destroy]

  # フィルタ定義
  before_filter :login_required # ログインチェック

  # 追加ヘルパー定義
  helper :project

  # コントローラー使用のヘルパー定義
  include ApplicationHelper
  include ProjectHelper
  include EventHelper

  #
  #ログイン中ユーザーが担当しているイベントのリストを取得．
  #
  #担当者、構成データも同時に取得．
  #
  def block_list
    conditions = "dat_projectusers.user_id = #{session['user']['id']}"
    if ! params[:project_id].nil?
      conditions += " AND dat_projectcomps.project_id = #{params[:project_id]}"
    else
      conditions += " AND dat_projectcomps.project_id = 0 "
    end
    opt = {
      :conditions => conditions,
      :include    => [{:dat_eventusers=>:dat_projectuser}, {:dat_projectcomp=>:dat_project}], 
      :order      => "dat_events.start_date desc, dat_events.start_time desc",
      :limit      => 5
    }
    @events = DatEvent.find(:all, opt)
  end

  #
  #イベント編集ダイアログを表示する
  #
  def dlg_index
  end

  #
  #=== イベントの新規追加(追加用の空データ生成)
  #
  #空のイベントモデルを生成して必要なパラメータをセットしてjsonデータで返却する
  #* task_kbn: 3をセット(イベントのtask_kbnが3であるため)
  #* アクティブなプロジェクトに参加しているユーザリスト
  #
  def dlg_new
    #-----------------------------
    # 新規イベントオブジェクト生成
    #-----------------------------
    @event = DatEvent.new

    #-----------------------------
    # 新規プロジェクト構成データオブジェクト生成
    # ※分類パラメータを初期設定（:dlg_tsk_edit_comp）
    #-----------------------------
    @projectcomp = DatProjectcomp.new(params[:dlg_evt_edit_comp])
    @projectcomp.task_kbn = "3" ;

    #-----------------------------
    # 参加ユーザー情報の取得
    #-----------------------------
    # プロジェクト参加ユーザーリストを取得
    projectusers = object_for_projectusers(@projectcomp.project_id)
    # イベント参加ユーザーリストを取得
    eventusers = object_for_eventusers(@event.id)

    #-----------------------------
    # JSONデータ生成
    #-----------------------------
    result  = {
      :event          => @event.attributes,
      :projectcomp    => @projectcomp.attributes,
      :projectusers   => projectusers,
      :eventusers     => eventusers
    }
    render :text => result_for_json(true, '', result)
  end

  #
  #=== イベント編集(編集用データの生成)
  #
  #params[:dlg_evt_edit_comp][:id]で指定されたイベントの情報を取得して，
  #jsonデータで返却する
  #
  #上記パラメータが指定されていない場合には新規作成画面にリダイレクトする
  #
  #params[:dlg_evt_edit_comp][:id] :: 編集するイベントのID
  #
  def dlg_edit
    if params[:dlg_evt_edit_comp][:id].nil? || params[:dlg_evt_edit_comp][:id] == ""
      #-----------------------------
      # IDが指定されていない場合、新規作成処理へリダイレクト
      #-----------------------------
      redirect_to :action => 'dlg_new'
      return
    end

    #-----------------------------
    # 登録済みプロジェクト構成情報を取得
    # ※プロジェクト、イベント情報も同時に取得
    #-----------------------------
    opt = {
      :conditions => [" dat_projectcomps.id = ? ", params[:dlg_evt_edit_comp][:id]],
      :include    => [:dat_project, :dat_event]
    }
    @projectcomp = DatProjectcomp.find(:first, opt)
    
    @event = @projectcomp.dat_event
    @event.start_time = @event.start_time ? @event.start_time.strftime('%H:%M:%S') : nil
    @event.end_time   = @event.end_time ? @event.end_time.strftime('%H:%M:%S') : nil

    #-----------------------------
    # 参加ユーザー情報の取得
    #-----------------------------
    # プロジェクト参加ユーザーリストを取得
    projectusers = object_for_projectusers(@projectcomp.project_id)
    # イベント参加ユーザーリストを取得
    eventusers = object_for_eventusers(@event.id)

    #-----------------------------
    # JSONデータ生成
    #-----------------------------
    result  = {
      :event          => @event.attributes_before_type_cast(),
      :projectcomp    => @projectcomp.attributes,
      :projectusers   => projectusers,
      :eventusers     => eventusers
    }
    render :text => result_for_json(true, '', result)
  end


  #
  #=== イベントの作成
  #
  #フォームから渡ってきたデータを元にまずはプロジェクトのアイテムを生成．
  #同時にイベントの実データを新規作成
  #
  #params[:dlg_evt_edit_comp] :: 追加するプロジェクトアイテムのデータ
  #params[:dlg_evt_edit_event] :: 追加するイベントのデータ
  #
  def dlg_create
    session_user_id = session["user"]["id"] 
    #-----------------------------
    # 新規プロジェクト構成データ生成
    #-----------------------------
    # フォームパラメータから新規プロジェクト構成オブジェクトを生成
    @projectcomp = DatProjectcomp.new(params[:dlg_evt_edit_comp])
    @projectcomp.task_kbn = "3" ;
    @projectcomp.create_user_id = session_user_id
    @projectcomp.update_user_id = session_user_id
    @projectcomp.last_operation_kbn = 2
    #-----------------------------
    # 新規イベントデータ生成
    #-----------------------------
    # フォームパラメータから新規イベントオブジェクトを生成
    @event = DatEvent.new( params[:dlg_evt_edit_event] )
    @event.create_user_id = session_user_id
    @event.update_user_id = session_user_id
    @event.last_operation_kbn = 2
    @projectcomp.dat_event = @event
    #-----------------------------
    # 追加位置（行番号）決定
    #-----------------------------
    # 基準となるプロジェクト構成IDが指定されている場合
    if ! params[:dlg_evt_edit_base_id].nil? && ! params[:dlg_evt_edit_base_id].empty?
      # 基準となるプロジェクト構成IDが指定されている場合
      # 基準データの後ろに追加
      base_projectcomp = DatProjectcomp.find(params[:dlg_evt_edit_base_id])

      @projectcomp.line_no = base_projectcomp.line_no + 1
    else
      # 基準となるプロジェクト構成IDが指定されていない場合
      # プロジェクトの最後尾に追加
      max_line_no = DatProjectcomp.maximum( :line_no,
                                            :conditions=>["project_id = ? ", @projectcomp.project_id]
                                          )
      max_line_no = 0 if max_line_no.nil?
      @projectcomp.line_no = max_line_no + 1
    end

    #-----------------------------
    # イベント担当者生成
    #-----------------------------
    # イベントユーザー指定時、イベントユーザーオブジェクトを生成
    if ! params[:dlg_evt_edit_eventusers].nil?
      for puser in params[:dlg_evt_edit_eventusers][:projectuser_id]
        # buildにて生成し、ここでは保存しない
        eventuser = @event.dat_eventusers.build(:projectuser_id=>puser)
        eventuser.create_user_id = session_user_id
      end
    end

    #-----------------------------
    # プロジェクト構成データ保存実施
    #-----------------------------
    if ! @projectcomp.save
      # ????? エラー処理 ????? 
      message = error_message_to_string(@projectcomp, 
                                        {:item_name=>app_localized_message(:label, :event_name)})
      if ! @event.errors.empty?
        message += "\n" unless message == ""
        message += error_message_to_string(@event)
      end
      render :text => result_for_json( false, message, {} )
      return
    end

    #-----------------------------
    # 行番号更新
    #-----------------------------
    if ! params[:dlg_evt_edit_base_id].nil? && ! params[:dlg_evt_edit_base_id].empty?
      # 間に挿入した場合、以降の構成データの行番号をずらす
      if ! DatProjectcomp.update_all(" line_no = line_no + 1 ", 
                                   [ "project_id = ? AND line_no >= ? AND id <> ? ",
                                       @projectcomp.project_id,
                                       @projectcomp.line_no,
                                       @projectcomp.id ]
                                     )
        # ????? エラー処理 ????? 
        render :text => result_for_json( false, app_localized_message(:error, :event_lineno_save_error), {} )
        return
      end
    end

    #-----------------------------
    # JSONデータ生成
    #-----------------------------
    result  = {
      :resulthtml   => "" #render_component_as_string(:controller=>"project", :action=>"list_detail", :params=>{:project_id=>@projectcomp.project_id})
    }
    render :text => result_for_json( true, '', result )
  end
  
  #
  #イベントデータの更新
  #
  #params[:dlg_evt_edit_comp][:id]で指定されたIDのイベントプロジェクトアイテムを取得し，
  #そのアイテム及び，関連イベントの情報を更新する．
  #
  #params[:dlg_evt_edit_comp] :: 追加するプロジェクトアイテムのデータ
  #params[:dlg_evt_edit_event] :: 追加するイベントのデータ
  #
  def dlg_update
    session_user_id = session["user"]["id"] 

    #-----------------------------
    # 登録済みオブジェクトを取得
    #-----------------------------
    opt = {
      :conditions => [" dat_projectcomps.id = ? ", params[:dlg_evt_edit_comp][:id]],
      :include    => [{:dat_event=>[:dat_eventusers]}]
    }
    @projectcomp = DatProjectcomp.find(:first, opt)
    @projectcomp.update_user_id = session_user_id
    @projectcomp.last_operation_kbn = 3
    
    @event = @projectcomp.dat_event
    @event.update_user_id = session_user_id
    @event.last_operation_kbn = 3

    #-----------------------------
    # イベント担当者生成
    #-----------------------------
    # イベントユーザー指定時、イベントユーザーオブジェクトを生成
    @event.dat_eventusers.clear  #一旦削除
    unless params[:dlg_evt_edit_eventusers].nil?
      for puser in params[:dlg_evt_edit_eventusers][:projectuser_id]
        # buildにて生成し、ここでは保存しない
        eventuser = @event.dat_eventusers.build(:projectuser_id=>puser)
        eventuser.create_user_id = session_user_id
      end
    end

    #-----------------------------
    # プロジェクト構成データ保存実施
    #-----------------------------
    unless @projectcomp.update_attributes(params[:dlg_evt_edit_comp])
      # ????? エラー処理 ????? 
      message = error_message_to_string(@projectcomp, 
                                        {:item_name=>app_localized_message(:label, :event_name)})
      render :text => result_for_json( false, message, {} )
      return
    end
    #-----------------------------
    # イベントデータ保存実施
    #-----------------------------
    unless @event.update_attributes(params[:dlg_evt_edit_event])
      # ????? エラー処理 ????? 
      message = error_message_to_string(@event)
      render :text => result_for_json( false, message, {} )
      return
    end

    #-----------------------------
    # JSONデータ生成
    #-----------------------------
    result = {
      :resulthtml   => ""
    }
    render :text => result_for_json(true, '', result)
  end

  #
  #=== イベントの削除
  #
  #params[:dlg_evt_edit_comp][:id]で指定されたプロジェクトアイテムを削除する．
  #関連するイベントデータも同時に削除される
  #
  def dlg_destroy
    if ! DatProjectcomp.destroy(params[:dlg_evt_edit_comp][:id])
      render :text => result_for_json(false, app_localized_message(:error, :event_destroy_error), {})
    else
      result  = {
        :resulthtml   => ""
      }
      render :text => result_for_json(true, '', result)
    end
  end

end